home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / mosq2.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  2.7 KB  |  102 lines

  1.       subroutine mosq2(vds,vbs,vgs,vdsat,vth,vbin,gamasd,cox,phi,
  2.      1   qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb)
  3.       implicit double precision (a-h,o-z)
  4. c
  5. c     initialize charges;
  6. c     change reference voltages for charge computation
  7. c
  8.       qg=0.0d0
  9.       qb=0.0d0
  10.       vbd=vbs-vds
  11.       vgb=vgs-vbs
  12.       vd=dmax1(phi-vbd,1.0d-8)
  13.       vs=dmax1(phi-vbs,1.0d-8)
  14.       vg=vgb-vbin+phi
  15.       vsp5=dsqrt(vs)
  16. c
  17. c     determine operating region
  18. c
  19.       if (vgs.le.vth) go to 1100
  20. c
  21. c     compute charges for "on" region
  22. c
  23.  1020 vsat=vdsat+vs
  24.       vs2=vs*vs
  25.       vs3=vs2*vs
  26.       vs5=vs3*vs2
  27.       vs1p5=vs*vsp5
  28.       vs2p5=vs1p5*vs
  29.  1025 if (vd.ge.vsat) go to 1035
  30.       ve=vd
  31.  1030 dvedvd=1.0d0
  32.       dvedvg=0.0d0
  33.       go to 1040
  34.  1035 ve=vsat
  35.       dvedvd=0.0d0
  36.       dvedvg=0.0d0
  37.  1040 ve2=ve*ve
  38.       ve3=ve2*ve
  39.       ve5=ve2*ve3
  40.       vep5=dsqrt(ve)
  41.       ve1p5=ve*vep5
  42.       ve2p5=ve1p5*ve
  43.       term0=ve+vs
  44.       term1=vep5+vsp5
  45.       term2=vep5*vsp5
  46.       term3=ve2+vs2
  47.       term4=ve*vs
  48.       term5=term0*term1
  49.       term6=(term3+term4)+term2*term0
  50.       term7=(term3+term4)*term1
  51.       term10=vep5+0.5d0*vsp5
  52.       term11=1.5d0*ve+vsp5*term10
  53.       term12=2.0d0*ve1p5+vsp5*term11
  54.       term20=0.5d0*vep5+vsp5
  55.       term21=1.5d0*vs+vep5*term20
  56.       term22=2.0d0*vs1p5+vep5*term21
  57.       argn=0.5d0*vg*term5-0.4d0*gamasd*term6-term7/3.0d0
  58.       argd=vg*term1-gamasd*(term0+term2)/1.5d0-0.5d0*term1*term0
  59.       argd2=argd*argd
  60.       qg=cox*(vg-argn/argd)
  61.       dgndve=0.5d0*vg*term11-0.4d0*gamasd*term12-
  62.      1   (2.5d0*ve2+vsp5*term12)/3.0d0
  63.       dddve=0.5d0*vg-gamasd*term10/1.5d0-0.5d0*term11
  64.       dqgdve=-cox/argd*(dgndve-(vg-qg/cox)*dddve)
  65.       dgndvs=0.5d0*vg*term21-0.4d0*gamasd*term22-
  66.      1   (2.5d0*vs2+vep5*term22)/3.0d0
  67.       dddvs=0.5d0*vg-gamasd*term20/1.5d0-0.5d0*term21
  68.       cgdb=-cox/(argd*vep5)*(dgndve-(vg-qg/cox)*dddve)*dvedvd
  69.       cgsb=-cox/(argd*vsp5)*(dgndvs-(vg-qg/cox)*dddvs)
  70.       cggb=cox*(1.0d0-term1/argd*(0.5d0*term0-vg+qg/cox))
  71.       argn=vg*(term0+term2)/1.5d0-0.5d0*gamasd*term5-0.4d0*term6
  72.       dgndve=vg*term10/1.5d0-0.5d0*gamasd*term11-0.4d0*term12
  73.       dgndvs=vg*term20/1.5d0-0.5d0*gamasd*term21-0.4d0*term22
  74.       qb=-gamasd*cox*argn/argd
  75.       cbdb=-cox/(vep5*argd)*(qb/cox*dddve+gamasd*dgndve)*dvedvd
  76.       cbsb=-cox/(vsp5*argd)*(qb/cox*dddvs+gamasd*dgndvs)
  77.       cbgb=-cox/argd*(gamasd*(term0+term2)/1.5d0+qb/cox*term1)
  78.       go to 2000
  79. c
  80. c  finish special cases
  81. c
  82.  1100 if (vg.gt.0.0d0) go to 1110
  83.       qg=cox*vg
  84.       cggb=cox
  85.       go to 1120
  86.  1110 gamma2=gamasd*0.5d0
  87.       sqarg=dsqrt(gamma2*gamma2+vg)
  88.       qg=gamasd*cox*(sqarg-gamma2)
  89.       cggb=0.5d0*cox*gamasd/sqarg
  90.  1120 qb=-qg
  91.       cbgb=-cggb
  92.       cgdb=0.0d0
  93.       cgsb=0.0d0
  94.       cbdb=0.0d0
  95.       cbsb=0.0d0
  96. c
  97. c  finished
  98. c
  99.  2000 qc=-(qg+qb)
  100.  2050 return
  101.       end
  102.